<?php

/**
 * CtDocumento filter form.
 *
 * @package    ingenyo-biblio
 * @subpackage filter
 * @author     Ivan
 */
class CtDocumentoFormFilterCollection extends sfFormFilter
{

  public function configure()
  {
    $this->disableLocalCSRFProtection();
    if ($this->getOption('container', 1))
    {
      $form = new CtDocumentoFormFilterCollection(null, array('container' => 0));
      $this->embedForm('filters', $form);
    }
    else
    {

      $subForm = new sfFormFilter();

      $ctDocumentoFormFilter = new CtDocumentoFormFilter(array(), array('is_the_last' => 1));
      $subForm->embedForm(0, $ctDocumentoFormFilter);

      $this->embedForm('custom', $subForm);

      //Busqueda por sucursal
      $sucursales = BbSucursalPeer::getSucursales();
      $sucursales[0] = 'Todos/as';
      $this->setWidget('sucursal', new sfWidgetFormChoice(array(
          'choices' => $sucursales,
        )));
      $this->setDefault('sucursal', 0);

      //Busqueda por Tipo de Documento
      $tipo_doc = CtValoresPeer::getTipificacion(sfConfig::get('app_tipificado_tipo_documento'));
      $tipo_doc[0] = 'Todos/as';
      $this->setWidget('tipo_doc', new sfWidgetFormChoice(array(
          'choices' => $tipo_doc,
        )));
      $this->setDefault('tipo_doc', 0);

      //Busqueda por Formato
      $formato = CtValoresPeer::getTipificacion(sfConfig::get('app_tipificado_formato'));
      $formato[0] = 'Todos/as';
      $this->setWidget('formato', new sfWidgetFormChoice(array(
          'choices' => $formato,
        )));
      $this->setDefault('formato', 0);

      $this->setWidget('valor_simple', new sfWidgetFormInput());
      //BUSQUEDA POR SIGNATURA TOPOGRAFICA SIMPLE Y AVANZADA      
      $this->setWidget('topografica', new sfWidgetFormInput());

      $this->setWidget('signatura_de_clase', new sfWidgetFormInput());
	  $this->getWidget('signatura_de_clase')->setAttribute('class', 'validate[groupRequired[topograficas]]');
      $this->setWidget('signatura_libristica', new sfWidgetFormInput());
	  $this->getWidget('signatura_libristica')->setAttribute('class', 'validate[groupRequired[topograficas]]');
      $this->setWidget('volumen', new sfWidgetFormInput());
	  $this->getWidget('volumen')->setAttribute('class', 'validate[groupRequired[topograficas]]');
      $this->setWidget('ubicacion', new sfWidgetFormInput());
	  $this->getWidget('ubicacion')->setAttribute('class', 'validate[groupRequired[topograficas]]');
      $this->setWidget('inventario', new sfWidgetFormInput());
	  $this->getWidget('inventario')->setAttribute('class', 'validate[groupRequired[topograficas]]');


      $this->getWidget('valor_simple')->setAttribute('class', 'validate[required,minSize[3]]');
      $this->getWidget('topografica')->setAttribute('class', 'validate[required]');
      $this->setWidget('tipo_busqueda', new sfWidgetFormInputHidden());
    }

  }

  public function getCriteriaFilter()
  {
    $tipo_busqueda = $this->taintedValues['tipo_busqueda'];
    if ($tipo_busqueda == 'simple')
    {
      return $this->crearCriteriaSimple();
    }
    else if ($tipo_busqueda == 'avanzado')
    {
      return $this->crearCriteriaAvanzado();
    }
    else if ($tipo_busqueda == 'topografica')
    {
      return $this->crearCriteriaTopografica();
    }
    else if ($tipo_busqueda == 'topografica_avanzada')
    {
      return $this->crearCriteriaTopograficaAvanzada();
    }

  }

  public function crearCriteriaSimple()
  {
    $c = new Criteria();

    $grupos = array(
      sfConfig::get('app_grupo_nombre_autor'),
      sfConfig::get('app_grupo_apellido_autor'),
      sfConfig::get('app_grupo_titulo'),
      sfConfig::get('app_grupo_tema'));

    $valor = $this->taintedValues['valor_simple'];
    $str = "";
    #$valor = trim($valor);
    $busqueda = $this->stripAccents($valor);
    #var_dump($busqueda);die();
    $table = 'dc1';
    $caracteristicas = CtCaracteristicaPeer::getChoiceByIdGrupoStr($grupos);

    $str = "(SELECT DISTINCT $table.idDocumento FROM CTDocumentoCaracteristica $table
    where $table.idCaracteristica IN ($caracteristicas) and $table.valorCaracteristica like '%" . $busqueda . "%')";



    if ($str != "")
    {
      $c->add(CTDocumentoPeer::ID, "CTDocumento.id in ($str) AND CTDocumento.fechaBaja is null", Criteria::CUSTOM);
    }

    return $c;

  }

  public function crearCriteriaAvanzado()
  {
    $c = new Criteria();
    $custom_filters = $this->taintedValues['custom'];
    $str = "";
    foreach ($custom_filters as $key => $custom)
    {
      //aca te agrege lo de los grupos en ves de las caracteristicas exactas
      if ($custom['valor'] != "")
      {
        $str .= $this->crearStr($custom, $key);
        if ($key != (count($custom_filters) - 1))
        {
          $str .= ' ' . $custom['logico'] . ' ';
        }
      }
    }

    if ($str != "")
    {
      $str_second = "";
      if ($this->taintedValues['sucursal'] != 0)
      {
        $str_second = '(' . CtDocumentoPeer::getDocumentosByIdSucursal($this->taintedValues['sucursal']) . ')';
      }

      if ($this->taintedValues['tipo_doc'] != 0)
      {
        if ($str_second != '')
        {
          $str_second .= ' AND ';
        }
        $str_second .= '(' . CtCaracteristicaPeer::getChoiceByIdGrupoQuery($this->taintedValues['tipo_doc']) . ')';
      }

      if ($this->taintedValues['formato'] != 0)
      {
        if ($str_second != '')
        {
          $str_second .= ' AND ';
        }
        $str_second .= '(' . CtCaracteristicaPeer::getChoiceByIdGrupoQuery($this->taintedValues['formato']) . ')';
      }

      if ($str_second == '')
      {
        $c->add(CTDocumentoPeer::ID, "CTDocumento.id in ($str)", Criteria::CUSTOM);
      }
      else
      {
        $c->add(CTDocumentoPeer::ID, "CTDocumento.id in ($str) AND $str_second AND CTDocumento.fechaBaja IS NULL", Criteria::CUSTOM);
      }
    }
    $test = $c->toString();
    return $c;

  }

  public function crearCriteriaTopografica()
  {

    $valor = $this->taintedValues['topografica'];
    $c = new Criteria();
    $c->addJoin(CtDocumentoPeer::ID, CtLibroPeer::IDDOCUMENTO);
    $c->addOr(CtLibroPeer::SIGNATURA_CLASE, $valor);
    $c->addOr(CtLibroPeer::SIGNATURA_LIBRISTICA, $valor);
    $c->addOr(CtLibroPeer::VOLUMEN, $valor);
    $c->addOr(CtLibroPeer::UBICACION, $valor);
    $c->addOr(CtLibroPeer::INVENTARIOLIBRO, $valor);
    return $c;

  }

  public function crearCriteriaTopograficaAvanzada()
  {
    #BUSCAR TODO EN CT LIBRO
    $signatura_de_clase = $this->taintedValues['signatura_de_clase'];
    $signatura_libristica = $this->taintedValues['signatura_libristica'];
    $volumen = $this->taintedValues['volumen'];
    $ubicacion = $this->taintedValues['ubicacion'];
    $inventario = $this->taintedValues['inventario'];
    $c = new Criteria();
    $c->addJoin(CtDocumentoPeer::ID, CtLibroPeer::IDDOCUMENTO);
    if (!empty($signatura_de_clase))
    {
      $c->add(CtLibroPeer::SIGNATURA_CLASE, $signatura_de_clase);
    }
    if (!empty($signatura_libristica))
    {
      $c->add(CtLibroPeer::SIGNATURA_LIBRISTICA, $signatura_libristica);
    }
    if (!empty($volumen))
    {
      $c->add(CtLibroPeer::VOLUMEN, $volumen);
    }
    if (!empty($ubicacion))
    {
      $c->add(CtLibroPeer::UBICACION, $ubicacion);
    }
    if (!empty($inventario))
    {
      $c->add(CtLibroPeer::INVENTARIOLIBRO, $inventario);
    }
    return $c;

  }

  public function crearStr($custom, $key)
  {
    $busqueda_sin_espacios = trim($custom['valor']);
    $busqueda = $this->stripAccents($busqueda_sin_espacios);
    $table = 'dc' . $key;
    $grupo = CtCaracteristicaPeer::getChoiceByIdGrupoStr($custom['caracteristica']);
    $str = "(SELECT DISTINCT $table.idDocumento FROM CTDocumentoCaracteristica $table
    where $table.idCaracteristica IN ($grupo) and $table.valorCaracteristica like '%" . $busqueda . "%')";
    return $str;

  }

  public function addCustom($next, $is_the_last)
  {
    $filters = $this->embeddedForms['filters'];
    $custom = $filters->embeddedForms['custom'];
    $ctDocumentoFormFilter = new CtDocumentoFormFilter(array(), array('is_the_last' => $is_the_last));
    $custom->embedForm($next, $ctDocumentoFormFilter);
    $filters->embedForm('custom', $custom);
    $this->embedForm('filters', $filters);

  }

  function stripAccents($text)
  {
    $text = htmlentities($text, ENT_QUOTES, 'UTF-8');
    $text = strtolower($text);
    $patron = array(
      // Espacios, puntos y comas por guion
      #'/[\., ]+/' => '-',
      // Vocales
      '/&agrave;/' => 'a',
      '/&egrave;/' => 'e',
      '/&igrave;/' => 'i',
      '/&ograve;/' => 'o',
      '/&ugrave;/' => 'u',
      '/&aacute;/' => 'a',
      '/&eacute;/' => 'e',
      '/&iacute;/' => 'i',
      '/&oacute;/' => 'o',
      '/&uacute;/' => 'u',
      '/&acirc;/' => 'a',
      '/&ecirc;/' => 'e',
      '/&icirc;/' => 'i',
      '/&ocirc;/' => 'o',
      '/&ucirc;/' => 'u',
      '/&atilde;/' => 'a',
      '/&etilde;/' => 'e',
      '/&itilde;/' => 'i',
      '/&otilde;/' => 'o',
      '/&utilde;/' => 'u',
      '/&auml;/' => 'a',
      '/&euml;/' => 'e',
      '/&iuml;/' => 'i',
      '/&ouml;/' => 'o',
      '/&uuml;/' => 'u',
      '/&auml;/' => 'a',
      '/&euml;/' => 'e',
      '/&iuml;/' => 'i',
      '/&ouml;/' => 'o',
      '/&uuml;/' => 'u',
      // Otras letras y caracteres especiales
      '/&aring;/' => 'a',
      '/&ntilde;/' => 'n',
    );

    $text = preg_replace(array_keys($patron), array_values($patron), $text);
    return $text;

  }

}
